# -*- coding: utf-8 -*-
'''
@authors 12551 Pedro Santos && 12552 Emanuel Teixeira
@date 8 de novembro de 2013
@obs: Criação de um ficheiro .csv referente aos
resultados obtidos nas consultas.
'''
import criar_bd
import csv
from sqlalchemy import *

class Stats():
    '''
    Classe Stats executa uma pesquisa na base de dados já criada,
    e cria dois ficheiro do tipo csv, um organizado por instituições 
    e outro por distritos.
    '''
    criar_bd.init_sqlalchemy('cna131fresultados.xls')
    try:
        database = create_engine('sqlite:///database.db')
        metadata = MetaData(database)
        dados = Table('dados', metadata, autoload = True)
        result = dados.select().execute()
    except IOError:
        print "Failed"
    global list_result, total_colocados
    total_colocados = 0.0
    list_result = []
    for i in result:
        total_colocados += float(i[4]) #contabiliza o total de colocados
        list_result.append(i) # coloca numa lista todas as linhas da base de dados

    def colocados_Por_InstituicaoEnsino(self):
        '''
        Método que executa a pesquisa de todas as instituições,
        adicionando-as numa lista, com as respectivas estatisticas.
        '''
        instituicoes = []
        instituicoes.append(list_result[0][1])
        for i in list_result:
            if instituicoes.count(i[1]) == 0:
                instituicoes.append(i[1])
        stats = []
        for k in instituicoes:
            colocados = 0.0
            sobrantes = 0.0
            for i in list_result:
                if i[1] == k:
                    colocados += float(i[4])
                    sobrantes += float(i[5])
            stats.append([k.encode('utf-8'), int(colocados), int(sobrantes), (colocados / total_colocados * 100)])

        with open('estatisticas_instituicao.csv', 'wb') as csvfile:
            stats_inst = csv.writer(csvfile, delimiter=';',
                                quotechar=',', quoting=csv.QUOTE_MINIMAL)
            stats_inst.writerows(stats)

    def colocados_Por_Distrito(self):
        '''
        Método que separa por distrito as instituições,
        e coloca numa lista as estatisticas orgaizadas
        '''
        #ligação entre as Universidades e o respectivo distrito
        dicionario = {"Lisboa" : ["Universidade Técnica de Lisboa",
        "Universidade de Lisboa", "Instituto Politécnico de Lisboa",
        "ISCTE", "Escola Superior de Enfermagem de Lisboa", "Universidade Nova de Lisboa", "Escola Superior de Hotelaria e Turismo do Estoril"],
        "Porto" : ["Universidade do Porto", "Instituto Politécnico do Porto", "Escola Superior de Enfermagem do Porto"],
        "Beja" : ["Instituto Politécnico de Beja"],
        "Coimbra" : ["Universidade de Coimbra", "Instituto Politécnico de Coimbra", "Escola Superior de Enfermagem de Coimbra"],
        "Setúbal" : ["Instituto Politécnico de Setúbal"],
        "Santarém" : ["Instituto Politécnico de Santarém", "Instituto Politécnico de Tomar"],
        "Leiria" : ["Instituto Politécnico de Leiria"],
        "Faro" : ["Universidade do Algarve"],
        "Aveiro" : ["Universidade de Aveiro"],
        "Açores" : ["Universidade dos Açores"],
        "Covilhã" : ["Universidade da Beira Interior"],
        "Évora" : ["Universidade de Évora"],
        "Braga" : ["Universidade do Minho", "Instituto Politécnico do Cávado e do Ave"],
        "Vila Real" : ["Universidade de Trás-os-Montes e Alto Douro"],
        "Madeira" : ["Universidade da Madeira"],
        "Bragança" : ["Instituto Politécnico de Bragança"],
        "Castelo Branco" : ["Instituto Politécnico de Castelo Branco"],
        "Guarda" : ["Instituto Politécnico da Guarda"],
        "Portalegre" : ["Instituto Politécnico de Portalegre"],
        "Viana do Castelo" : ["Instituto Politécnico de Viana do Castelo"],
        "Viseu" : ["Instituto Politécnico de Viseu"]}

        stats = []
        for chave, valores in dicionario.iteritems():
            colocados = 0.0
            sobrantes = 0.0
            for i in valores:
               for k in list_result:
                    if k[1].encode('utf-8') == i:
                        colocados += float(k[4])
                        sobrantes += float(k[5])
            stats.append([chave, int(colocados), int(sobrantes), (colocados / total_colocados * 1000)])

        with open('estatisticas_distrito.csv', 'wb') as csvfile:
            stats_dist = csv.writer(csvfile, delimiter=';',
                                quotechar=',', quoting=csv.QUOTE_MINIMAL)
            stats_dist.writerows(stats)